package w83b.w83bOperacionesPaso.w83bComunicaciones;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import w83b.w83bBeans.W83bComunicacionesBean;
import w83b.w83bBeans.W83bDocBean;
import w83b.w83bBeans.W83bPlantillasBean;
import w83b.w83bBeans.W83bUsuarioXLNetsBean;
import w83b.w83bUtilidades.W83bUtilidadesComunes;
import w83b.w83bUtilidades.W83bUtilidadesRTF;
import w83b.w83bUtilidadesComunes.W83bClsConstantes;
import w83b.w83bUtilidadesComunes.W83bClsTrazas;
import w83b.w83bUtilidadesComunes.W83bDateUtil;
import w83b.w83bUtilidadesComunes.W83bUtilidades;
import w83b.w83bUtilidadesLibroRegistro.W83bLibroRegistro;
import w83b.w83bUtilidadesLibroRegistro.W83bLibroRegistroException;
import es.ejie.frmk.infraestructura.internacionalizacion.Q70GestorMensajesi18n;
import es.ejie.frmk.presentacion.operacion.paso.Q70ActionPasoOP;
import es.ejie.frmk.presentacion.sesiondatos.Q70ContextoEJIE;

public class W83bGenerarRtfComImpugnAction extends Q70ActionPasoOP{


	
	protected void processOP(Q70ContextoEJIE contexto, ActionErrors errores, ActionMapping mapping,
			ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		
	}

	protected ActionForward processForward(Q70ContextoEJIE contexto, ActionErrors errors, ActionMapping mapping, 
			ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		//String strRutaRtf ="";// Q70ListenerUtils.getApplicationProperty("RUTA_PLANTILLAS_RTF")+"plantillaCertNumDelCentSind.rtf";
		
	    List lista=(List)contexto.get("w83bResultadoBean");
	    StringBuffer observaciones=new StringBuffer(W83bClsConstantes.CUARENTA);
	    int tamanyo = 25;
		if(lista.size()-1<25){
			tamanyo = lista.size()-1;
		}
		if(tamanyo>=1){
			HashMap mapaPar = new HashMap();
			HashMap mapaParGeneral = new HashMap();
			
			String idioma=(String)contexto.get(W83bClsConstantes.CONSTANTE_CONTEXTO_IDIOMA);
			W83bUsuarioXLNetsBean usuario=(W83bUsuarioXLNetsBean)contexto.get(W83bClsConstantes.CONSTANTE_CONTEXTO_USUARIO);
	        HashMap datosDelDep=  W83bUtilidadesComunes.obtenerTitulosDelegacionDepartamento(usuario,idioma);  	
	        HashMap generarRtfaux = (HashMap)contexto.get("generarRtf");
			if(null==generarRtfaux){
				generarRtfaux = new HashMap();
			}

			mapaParGeneral.put("<<DEPEUS>>",((StringBuffer)datosDelDep.get("tituloDepEu")).toString());
			mapaParGeneral.put("<<DEPCAS>>",((StringBuffer)datosDelDep.get("tituloDepEs")).toString());
			
			//strRutaRtf = Q70ListenerUtils.getApplicationProperty("RUTA_PLANTILLAS_RTF")+"plantillaComunImpug.rtf";
			
			mapaParGeneral.put("<<DELEUS>>",((StringBuffer)datosDelDep.get("tituloDelelegacionEu")).toString());
			mapaParGeneral.put("<<DELCAS>>",((StringBuffer)datosDelDep.get("tituloDelelegacionEs")).toString());
			mapaParGeneral.put("<<DIRDELEGACION>>",(String)datosDelDep.get("dirdelegacion"));
			
			//CharSequence content=W83bUtilidadesRTF.leerTodoFichero(strRutaRtf);
			HashMap mapaPlantillas = (HashMap)contexto.get("w83bPlantillasMap");
			byte[] plantilla = ((W83bPlantillasBean)mapaPlantillas.get(W83bClsConstantes.COMUNICACION_RECEPCION_IMPUGNACION.toUpperCase())).getFichero();
			
			CharSequence content=W83bUtilidadesRTF.leerTodoFichero(plantilla);
			String contenido=content.toString();
			
			StringBuffer contenidoBuffer=new StringBuffer(contenido);
			int ifooter=contenido.lastIndexOf("footer");
			String delantefooter=contenido.substring(ifooter,contenido.length());
			int ifooterLlave=delantefooter.indexOf("}")+2;
			int finDelantelimpio=ifooter+ifooterLlave;
			int z=contenido.lastIndexOf("page")+6;
			StringBuffer parteDelanteLimpia=new StringBuffer(contenido.substring(0,finDelantelimpio));
			String parteAtrasLimpia=contenido.substring(z,contenido.length());
			contenidoBuffer=new StringBuffer(contenido.substring(finDelantelimpio,z));
			parteDelanteLimpia=W83bUtilidadesRTF.sustituirCadenaCaracteresString(parteDelanteLimpia, mapaParGeneral);
			List datosLista = (ArrayList)contexto.get("documento");
			int tamanyoTotal = 0;
			if(datosLista.size()>0){
				tamanyoTotal = Integer.parseInt((String)datosLista.get(datosLista.size()-1));
				datosLista.remove(datosLista.size()-1);
				datosLista.remove(datosLista.size()-1);
			}else{
				datosLista.add(parteDelanteLimpia);
				tamanyoTotal = tamanyoTotal + parteDelanteLimpia.toString().getBytes().length;			
			}
			List comunicind=new ArrayList();
			W83bDocBean docBean= new W83bDocBean();
			StringBuffer elemento=new StringBuffer();
			StringBuffer elementoind=new StringBuffer();
			int tamnyo = 0;
			for(int i=0;i<tamanyo;i++)
			{
				mapaPar.put("<<DEPEUS>>",((StringBuffer)datosDelDep.get("tituloDepEu")).toString());
				mapaPar.put("<<DEPCAS>>",((StringBuffer)datosDelDep.get("tituloDepEs")).toString());
				mapaPar.put("<<DELEUS>>",((StringBuffer)datosDelDep.get("tituloDelelegacionEu")).toString());
				mapaPar.put("<<DELCAS>>",((StringBuffer)datosDelDep.get("tituloDelelegacionEs")).toString());
				mapaPar.put("<<DIRDELEGACION>>",(String)datosDelDep.get("dirdelegacion"));
				W83bComunicacionesBean comunic=(W83bComunicacionesBean)lista.get(i);
				observaciones=new StringBuffer(W83bClsConstantes.CUARENTA);//NOPMD
				observaciones.append(Q70GestorMensajesi18n.getSingleton().getMessage("w83bcomun","comun.comunicaciones.impuglit",comunic.getIdioma(),null)).append(" ");
				if ("1".equals(comunic.getOrderby())){
					observaciones.append(Q70GestorMensajesi18n.getSingleton().getMessage("w83bcomun","comun.impugnaciones.acta",comunic.getIdioma(),null)).append(" ");
				}else{
					observaciones.append(Q70GestorMensajesi18n.getSingleton().getMessage("w83bcomun","comun.impugnaciones.preaviso",comunic.getIdioma(),null)).append(" ");
				}
				observaciones.append(comunic.getTerrit()+"/"+comunic.getAnoacta()+"/"+W83bUtilidades.rellenarCaracter(comunic.getNacta(), "0", 6, true));
					
				long milisegundos = System.currentTimeMillis();
				String [] resul = null;
				try{
					resul=W83bLibroRegistro.getAltaRegistro(true, comunic.getUsuarioBean().getModeloSal(), "S", "E", Q70GestorMensajesi18n.getSingleton().getMessage("w83bcomun","comun.informes.direccionTrabajo_es",comunic.getIdioma(),null), comunic.getTerrit(), "" ,observaciones.toString(), comunic.getUsuarioBean());
				}catch(W83bLibroRegistroException e){
					  generarRtfaux = (HashMap)contexto.get("generarRtf");
						if(null==generarRtfaux){
							generarRtfaux = new HashMap(); //NOPMD
						}
					  generarRtfaux.put("error", "errorLibroRegistro");
					  contexto.set("generarRtf", generarRtfaux);
					  return mapping.findForward("fin"); 
				}
				W83bClsTrazas.trazaError(comunic.getUsuarioBean(), "tiempo antes de query="+(System.currentTimeMillis()- milisegundos), null);
				comunic.setNumsalida(resul[0]);
				comunic.setFechaaregistro(resul[1]);
				mapaPar.put("<<NUMSALIDA>>",W83bUtilidadesRTF.ponerBlancoANulo(comunic.getNumsalida()));
				List fa;
				if (W83bClsConstantes.CONSTANTE_CASTELLANO.equals(idioma)){
					fa=W83bDateUtil.getInstance().separarDiaMesAnyo(comunic.getFechacomunicacion(),W83bClsConstantes.CONSTANTE_CASTELLANO);
				}
				else{
					fa=W83bDateUtil.getInstance().separarDiaMesAnyo(comunic.getFechacomunicacion(),W83bClsConstantes.CONSTANTE_EUSKARA);
				}
				mapaPar.put("<<FECHA>>",W83bDateUtil.getInstance().devolverLiteralfechamin(Integer.parseInt((String)fa.get(0)),Integer.parseInt((String)fa.get(1)),Integer.parseInt((String)fa.get(2)),idioma).toString());
				mapaPar.put("<<RAZON>>",comunic.getRazon());
				if (W83bClsConstantes.CONSTANTE_NO_VALIDADA.equals(comunic.getCentroSel())||StringUtils.isEmpty(comunic.getDirorig())){
					mapaPar.put("<<DOMIC>>",W83bUtilidadesRTF.ponerBlancoANulo(comunic.getDomicilio()));
				}
				else{
					mapaPar.put("<<DOMIC>>",W83bUtilidadesRTF.ponerBlancoANulo(comunic.getDirorig()));
				}
				if (W83bClsConstantes.CONSTANTE_NO_VALIDADA.equals(comunic.getCentroSel())||StringUtils.isEmpty(comunic.getCporig())){
					mapaPar.put("<<CPOST>>",comunic.getCodigopostal());
				}else{
					mapaPar.put("<<CPOST>>",comunic.getCporig());
				}
				mapaPar.put("<<LOCAL>>",W83bUtilidadesRTF.ponerBlancoANulo(comunic.getMunicipio()).toUpperCase());
				mapaPar.put("<<PROV>>",comunic.getProvincia().toUpperCase());
				
				if ("1".equals(comunic.getOrderby())){
					mapaPar.put("<<EXPDTE>>","Nº Acta: "+comunic.getTerrit()+"/"+comunic.getAnoacta()+"/"+W83bUtilidades.rellenarCaracter(comunic.getNacta(), "0", 6, true));
				}
				else{
					mapaPar.put("<<EXPDTE>>","Nº Preaviso: "+comunic.getTerrit()+"/"+comunic.getAnoacta()+"/"+W83bUtilidades.rellenarCaracter(comunic.getNacta(), "0", 6, true));
				}	
				mapaPar.put("<<LOCALID>>",(String)datosDelDep.get("localiddelegacion"));
				mapaPar.put("<<FECUSK>>",W83bDateUtil.getInstance().devolverLiteralfechaentera(Integer.parseInt((String)fa.get(0)),Integer.parseInt((String)fa.get(1)),Integer.parseInt((String)fa.get(2)),W83bClsConstantes.CONSTANTE_EUSKARA).toString());
				mapaPar.put("<<FECCAS>>"," a "+W83bDateUtil.getInstance().devolverLiteralfechaentera(Integer.parseInt((String)fa.get(0)),Integer.parseInt((String)fa.get(1)),Integer.parseInt((String)fa.get(2)),W83bClsConstantes.CONSTANTE_CASTELLANO).toString());
				mapaPar.put("<<LINEAORDEN>>","");
				mapaPar.put("<<PROVI>>",comunic.getDescTerritorio().toUpperCase());
				mapaPar.put("<<DELEGADO>>",W83bUtilidadesRTF.ponerBlancoANulo(comunic.getNombrefirmante()));
				mapaPar.put("<<CARGO>>",comunic.getDescfirmante().toUpperCase());
				mapaPar.put("<<LINEARESPONSABLE>>","");
				mapaPar.put("<<CARGOEU>>",comunic.getDescfirmanteeu().toUpperCase());
				elementoind=W83bUtilidadesRTF.sustituirCadenaCaracteresString(contenidoBuffer, mapaPar);
				elemento=W83bUtilidadesRTF.sustituirCadenaCaracteresString(contenidoBuffer, mapaPar);
				String delante="";
				String detras="";
				String delanteL="";
				String detrasL="";
				int k=elementoind.lastIndexOf("page");
				delante=elementoind.substring(0,k);
				detras=elementoind.substring(k,elementoind.length());
				delanteL=delante.substring(0, delante.lastIndexOf("{"));
				detrasL=detras.substring( detras.indexOf("}")+1,detras.length());
				elementoind=new StringBuffer(delanteL.concat(detrasL));//NOPMD
				
				if (i==lista.size()-2){
					int j=elemento.lastIndexOf("page");
					delante=elemento.substring(0,j);
					detras=elemento.substring(j,elemento.length());
					delanteL=delante.substring(0, delante.lastIndexOf("{"));
					detrasL=detras.substring( detras.indexOf("}")+1,detras.length());
					elemento=new StringBuffer(delanteL.concat(detrasL));//NOPMD
				}
				
				tamnyo = tamnyo + elemento.toString().length();
				W83bClsTrazas.trazaError(null,"tamanyo->"+i+" datoslst->"+tamnyo,null);
				datosLista.add(elemento);
				tamanyoTotal = tamanyoTotal + elemento.toString().getBytes().length;
				String[] imp=comunic.getNimpug().split("\\,");
				String[] datosimp;
				for (int h=0;h<imp.length;h++){
					StringBuffer datosind=new StringBuffer();//NOPMD
					datosind.append(parteDelanteLimpia);
					datosind.append(elementoind);
					datosind.append(parteAtrasLimpia);
					datosimp=imp[h].split("\\|");
					docBean= new W83bDocBean();//NOPMD
					docBean.setNumActaTerritorio(comunic.getTerrit());
					docBean.setNumActaAno(datosimp[1]);
					docBean.setNumActa(datosimp[0]);
					docBean.setCodTramite(String.valueOf(W83bClsConstantes.DOS));
					docBean.setCodFase(String.valueOf(W83bClsConstantes.CINCO));
					docBean.setNombre("ComunicacionImpugnacion"+comunic.getTerrit()+"/"+datosimp[1]+"/"+W83bUtilidades.rellenarCaracter(datosimp[0], "0", 6, true)+".rtf");
					docBean.setFechaRegistro(comunic.getFechaaregistro());
					docBean.setUsuario(comunic.getUsuarioBean().getIdUsuario());
					docBean.setNumeroRegistro(comunic.getNumsalida());
					byte[] bytes = datosind.toString().getBytes();
					InputStream input=new ByteArrayInputStream(bytes);//NOPMD
					docBean.setFileData(input);
					docBean.setTamanyo(datosind.toString().getBytes().length);
					docBean.setEscomunicacion(comunic.getEscomunicacion());
					comunicind.add(docBean);
				    Runtime garbage = Runtime.getRuntime();
				    //W83bClsTrazas.trazaError(null,"Memoria libre antes de limpieza: "+ garbage.freeMemory(),null);
				    System.runFinalization();
				    System.gc();  	   
				    garbage.gc();
				    //W83bClsTrazas.trazaError(null,"Memoria libre después de limpieza: "+ garbage.freeMemory(),null);
				    datosind = null;
					docBean = null;
				}
			}
			datosLista.add(parteAtrasLimpia);
			tamanyoTotal = tamanyoTotal + parteAtrasLimpia.toString().getBytes().length;
			datosLista.add(String.valueOf(tamanyoTotal));
			contexto.set("documento",datosLista);
			generarRtfaux.put("comunicind", null);
		    String tam = "";
		    int tamInt = 0;
		    if(null!=generarRtfaux){
		    	tam = (String)generarRtfaux.get("tam");
		    	if(StringUtils.isNotEmpty(tam)){
		    		tamInt = Integer.parseInt(tam);
		    	}
		    }
		    tamInt = tamInt + tamanyo;
		    generarRtfaux.put("tam", String.valueOf(tamInt));
		    contexto.set("generarRtf", generarRtfaux);
		    contexto.set("w83bListaInd", comunicind);
		    generarRtfaux.put("comunicind",comunicind);
			contexto.set("generarRtf",generarRtfaux);
	    
	    List listatemp = lista.subList(tamanyo,lista.size());
	    
	    lista = new ArrayList();
	    lista.addAll(listatemp);
	    contexto.set("w83bResultadoBean",lista);
		Runtime garbage = Runtime.getRuntime();
	    //W83bClsTrazas.trazaError(null,"ending Action - Memoria libre antes de limpieza: "+ garbage.freeMemory(),null);
	    System.runFinalization();
	    System.gc();  	   
	    garbage.gc();
	    //W83bClsTrazas.trazaError(null,"ending Action - Memoria libre después de limpieza: "+ garbage.freeMemory(),null);
			
		    return mapping.findForward("ok");
		}else{
			return mapping.findForward("fin");
		}
	    
	}
		
}

